package _3_data_struct;

import com.google.common.collect.Lists;
import java.util.Iterator;
import javax.crypto.spec.PSource;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 创建 ArrayList 的写法技巧             {@link #instanceList()}    <p>
 * java.util.Arrays.asList() 的问题     {@link #asList()}          <p>
 * ArrayList.set(index,object) 方法     {@link #listSetValueOfIndex()}       <p>
 * 分割成 List<List<>>                  {@link #splitList()}       <p>
 */
public class AboutArrayList {

  /**
   * 创建 ArrayList 的写法技巧
   */
  @Test
  public void instanceList() {
    // 使用 google guava
    ArrayList<String> strings = Lists.newArrayList("A", "B", "C");

    // java9 使用 List.of()，创建的 list 是不可变list

    // 使用 java8 stream, 适用于创建一个静态不可变对象
    List<Object> collect = Stream.of("A", "B", "C").collect(Collectors.toList());

    // 双大括号, 匿名内部类 初始化, 新建一个列表并赋初值 A、B、C
    ArrayList<String> list = new ArrayList<String>() {
      {
        add("A");
        add("B");
        add("C");
      }
    };

    // 先实例化, 再 add

    // 不推荐： 使用 Arrays.asList() 创建的是 Arrays.ArrayList, 而不是 java.util.ArrayList
    List<String> arrayListInArrays = Arrays.asList("A", "B", "C");
    arrayListInArrays.add("D"); //
  }

  @Test
  public void testIter() {
    List<String> a = Lists.newArrayList("1", "1", "2");
    Iterator<String> iterator = a.iterator();
    while (iterator.hasNext()) {
      String next = iterator.next();
      if (next.equals("1")) {
        iterator.remove();
      }
    }
    Iterator<String> iterator1 = a.iterator();
    while (iterator1.hasNext()) {
      System.out.println(iterator1.next());
    }
  }


  @Test
  public void asList() {
    List<Integer> integers = new ArrayList<>();
    System.out.println(integers);
    List<Integer> integerList = new ArrayList<>(Arrays.asList(0, 1, 2));
    System.out.println(integerList);
  }

  @Test
  public void collectionInterface() {
    /** 返回的类型为 Collections.EmptyList {@link Collections.EmptyList} 是一个 private 类 */
    List emptyList = Collections.emptyList();
  }

  /**
   * set(index, Object) 方法, 必须在 List 有这个 index 之后才能使用
   */
  @Test
  public void listSetValueOfIndex() {
    List<String> list = new ArrayList<>(10);
    for (int i = 0; i < 10; i++) {
      list.add(String.valueOf(i));
    }
    list.set(5, "没错");
    System.out.println(list.get(5));

    list = new ArrayList<>(10);
    list.set(0, "出错");

    list = new ArrayList<>(10);
    list.set(1, "出错");
  }

  /**
   * 把 List 分割为多个 List
   */
  @Test
  public void splitList() {
    List<Integer> origin = new ArrayList<>(35);
    // List<Integer> origin = new ArrayList<>();
    for (int i = 0; i < 35; i++) {
      origin.add(i);
    }
    // origin.clear();

    int groupSize = 8;
    int group = (origin.size() + groupSize - 1) / groupSize;
    for (int i = 0; i < group; i++) {
      // List<Integer> integers = origin.subList(i * groupSize, (i + 1 == group) ? origin.size() : (i + 1) * groupSize);
      // for (Integer integer : integers) {
      //     System.out.println(integer);
      // }
      int start = i * groupSize;

      for (int j = 0; j < groupSize; j++) {
        Integer every = origin.get(start + j);
        System.out.println(every);
      }
    }
  }

  @Test
  public void reverseLoop() {
    List<String> a = List.of("1", "2", "3");
    for (int i = a.size()-1; i >= 0; i--) {
      System.out.println(a.get(i));
    }

  }
}
